package com.ruoyi.huanjing.controller;

import com.ruoyi.huanjing.entity.Atmospheric;
import ucar.ma2.Array;
import ucar.ma2.Index;
import ucar.nc2.NetcdfFile;
import ucar.nc2.Variable;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class AReadNC {

    public static void main(String[] args) throws IOException {

        String filePath = "E:\\localfile\\环境数据概览\\nc\\温度.nc";

        // 示例：读取指定 time 和 height 下的所有经纬度的 tempData 值
        int timeIndex = 1; // 假设你要读取第一个时间点
        int heightIndex = 1; // 假设你要读取第一个高度层
        List<Atmospheric> tempDataList = readTempDataAtTimeAndHeight(filePath, timeIndex, heightIndex);
        tempDataList.forEach(System.out::println);

    }

    /**
     * 读取指定 valid_time 和 pressure_level 下的所有经纬度的 tempData 值
     *
     * @param filePath    NC 文件路径
     * @param timeIndex   时间索引
     * @param pressureIndex 气压索引
     * @return 包含所有经纬度对应的 tempData 值的列表
     * @throws IOException 如果读取文件时发生错误
     */
    private static List<Atmospheric> readTempDataAtTimeAndHeight(String filePath, int timeIndex, int pressureIndex) throws IOException {

        try (NetcdfFile ncFile = NetcdfFile.open(filePath)) {
            Variable validTimeVar = ncFile.findVariable("valid_time");
            Variable latVar = ncFile.findVariable("latitude");
            Variable lonVar = ncFile.findVariable("longitude");
            Variable pressureVar = ncFile.findVariable("pressure_level");
            Variable tempVar = Arrays.stream(new String[]{
                            "t"})
                    .map(ncFile::findVariable)
                    .filter(Objects::nonNull)
                    .findFirst()
                    .orElse(null);

            Array latData = latVar.read();
            Array lonData = lonVar.read();
            Array tempData = tempVar.read();

            List<Atmospheric> tempDataList = new ArrayList<>();
            Index index = tempData.getIndex();
            for (int la = 0; la < latData.getSize(); la++) {
                for (int lo = 0; lo < lonData.getSize(); lo++) {
                    double temp = tempData.getDouble(index.set(timeIndex, pressureIndex, la, lo));
                    if (!Double.isNaN(temp)) { // 排除无效值
                        Atmospheric atmospheric = new Atmospheric()
                                .setHeight(BigDecimal.valueOf(pressureIndex))
                                .setLon(BigDecimal.valueOf(lonData.getDouble(lo)))
                                .setLat(BigDecimal.valueOf(latData.getDouble(la)))
                                .setValue(BigDecimal.valueOf(temp))
                                .setTime(BigDecimal.valueOf(validTimeVar.read().getDouble(timeIndex)));

                        tempDataList.add(atmospheric);
                    }
                }
            }
            return tempDataList;
        } catch (IOException e) {
            throw e;
        }
    }
}